package com.cjc.express.controller;


import com.cjc.express.entity.*;
import com.cjc.express.exception.ImportException;
import com.cjc.express.exception.ValidationException;
import com.cjc.express.service.AdminService;
import com.cjc.express.utils.ExcelImportUtils;
import com.github.pagehelper.Page;
import com.google.gson.JsonObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

/**
 * ========================
 * Created with intellij IDEA
 * 创建者：杜一平
 * 日期：2017/1/19（星期五）
 * 时间：08：00
 * 说明：该类是快递中心后台管理员的控制层，主要接受管理员的请求，反馈管理相关的操作信息
 * ==========================
 */

@RestController
@CrossOrigin
@RequestMapping(value = "/admin", method = RequestMethod.POST)
@Api(description = "管理员模块")
public class AdminController extends BaseController {
    // 自动装配管理员服务层，向服务层提交操作请求
    @Autowired
    private AdminService adminService;
    // 返回公司的相应对象
    CompanyJsons companyJsons = new CompanyJsons();
    // 返回报价表的相应对象
    PriceJsons priceJsons = new PriceJsons();

    // 日志配置
    private final static Logger logger = LoggerFactory.getLogger(AdminController.class);

    /**
     * 查询所有公司记录
     *
     * @param request http请求
     * @return CompanyJsons
     */
    @ApiOperation(value = "查询所有公司表", notes = "无参数")
    @RequestMapping(value = "/allCompanyList", method = RequestMethod.POST)
    @ResponseBody
    public CompanyJsons listallcompany(HttpServletRequest request) {
        try {
            // 获取公司列表
            List<Company> companies = adminService.listallcompany();
            // 获取返回格式
            CompanyJsons companyJsons = new CompanyJsons(1000, "查询成功", companies);
            return companyJsons;
        } catch (ValidationException r) {
            // 校验异常
            companyJsons.setStatus(1001);
            companyJsons.setMessage(r.getMessage());
            companyJsons.setResult(null);
            return companyJsons;
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticCompanyJsons.companyJsons2;
        }
    }

    /**
     * 插入快递公司控制方法
     *
     * @param request http请求
     * @return CompanyJsons 快递公司表JSON值
     */
    @ApiOperation(value = "插入快递公司表", notes = "快递公司：companyname ")
    @RequestMapping(value = "/insertCompany", method = RequestMethod.POST)
    @ResponseBody
    public CompanyJsons insertcompany(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取公司名字字段
            String companyname = jsonObject.get("companyname").getAsString().trim();
            // 执行插入操作
            return adminService.insertCompany(companyname);
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticCompanyJsons.companyJsons2;
        }
    }

    /**
     * 更新快递快递公司控制方法
     *
     * @param request http请求
     * @return CompanyJsons 快递公司表JSON值
     */
    @ApiOperation(value = "依据id更新快递公司表", notes = "公司id：companyid 公司名字：companyname")
    @RequestMapping(value = "/updateByCompanyid", method = RequestMethod.POST)
    @ResponseBody
    public CompanyJsons updatebycompanyid(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取公司id
            String companyid = jsonObject.get("companyid").getAsString().trim();
            // 获取公司名字
            String companyname = jsonObject.get("companyname").getAsString().trim();
            // 新建临时公司对象
            Company company1 = new Company(companyid, companyname);
            // 执行更新操作
            return adminService.updateByPrimaryKeySelective(company1);
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticCompanyJsons.companyJsons2;
        }
    }

    /**
     * 通过id删除快递快递公司控制方法
     *
     * @param request http请求
     * @return CompanyJsons 快递公司表JSON值
     */
    @ApiOperation(value = "依据id删除快递公司表", notes = "公司id：companyid")
    @RequestMapping(value = "/deleteByCompanyid", method = RequestMethod.POST)
    @ResponseBody
    public CompanyJsons deletebyid(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取公司id
            String companyid = jsonObject.get("companyid").getAsString().trim();
            // 执行删除操作
            return adminService.deleteByPrimaryKey(companyid);
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticCompanyJsons.companyJsons2;
        }
    }

    /**
     * 插入报价表控制方法
     *
     * @param request http请求
     * @return PriceJsons 报价表JSON值
     */
    @ApiOperation(value = "插入报价表", notes = " 公司名字：companyname 收件地：pricedest " +
            "初始重量：priceinitweight 加重：priceoverweight")
    @RequestMapping(value = "/insertPrice", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons insertprice(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);

            // 获取公司名字
            String companyname = jsonObject.get("companyname").getAsString().trim();
            // 获取收件地
            String pricedest = jsonObject.get("pricedest").getAsString().trim();
            // 初始重量
            BigDecimal priceinitweight = jsonObject.get("priceinitweight").getAsBigDecimal();
            // 加重
            BigDecimal priceoverweight = jsonObject.get("priceoverweight").getAsBigDecimal();
            // 创建price对象
            Price price = new Price(companyname, pricedest, priceinitweight, priceoverweight);
            // 执行插入操作
            return adminService.insertSelective(price);
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 删除报价表控制方法
     *
     * @param request http请求
     * @return PriceJsons 报价表JSON值
     */
    @ApiOperation(value = "依据id删除报价表", notes = "报价表id：priceid")
    @RequestMapping(value = "/deleteByPriceid", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons deletepricebyid(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取报价表id
            String priceid = jsonObject.get("priceid").getAsString().trim();
            // 执行删除操作
            return adminService.deleteByPriceId(priceid);
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 更新报价表控制方法
     *
     * @param request http请求
     * @return PriceJsons 报价表JSON值
     */
    @ApiOperation(value = "依据id更新报价表", notes = "报价表id：priceid 公司名字：companyname 收件地：pricedest " +
            "初始重量：priceinitweight 超重：priceoverweight")
    @RequestMapping(value = "/updateBypriceid", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons updateprice(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取报价表id
            String priceid = jsonObject.get("priceid").getAsString().trim();
            // 公司名字
            String companyname = jsonObject.get("companyname").getAsString().trim();
            // 收件地
            String pricedest = jsonObject.get("pricedest").getAsString().trim();
            // 初始重量
            BigDecimal priceinitweight = jsonObject.get("priceinitweight").getAsBigDecimal();
            // 加重
            BigDecimal priceoverweight = jsonObject.get("priceoverweight").getAsBigDecimal();

            Price price = new Price(priceid, companyname, pricedest, priceinitweight, priceoverweight);
            // 更新
            return adminService.updateByPrimaryKeySelective(price);
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 查询所有报价表控制方法
     *
     * @return PriceJsons 报价表JSON值
     */
    @ApiOperation(value = "查询所有报价表", notes = "页数：pageNum 显示数目：pageSize")
    @RequestMapping(value = "/allPriceList", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons listallprice(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 页数
            int pageNum = jsonObject.has("pageNum")
                    ? jsonObject.get("pageNum").getAsInt() : 1;
            // 每页数目
            int pageSize = jsonObject.has("pageSize")
                    ? jsonObject.get("pageSize").getAsInt() : 10;
            // 查找
            Page<Price> prices = adminService.selectAllPrice(pageNum, pageSize);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", prices);
            return priceJsons;
        } catch (ValidationException r) {
            priceJsons.setStatus(1001);
            priceJsons.setMessage(r.getMessage());
            priceJsons.setResult(null);
            return priceJsons;
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 用于输入收件地，返回同一收件地不同公司的报价表
     *
     * @param request http请求
     * @return 0 失败
     */
    @ApiOperation(value = "依据收件地查询报价表", notes = "收件地：dest 页数：pageNum 显示数目：pageSize")
    @RequestMapping(value = "/priceListDest", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons listdest(HttpServletRequest request) throws IOException {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取相应字段
            String dest = jsonObject.get("dest").getAsString().trim();
            // 设置可能不传递参数解决形式
            int pageNum = jsonObject.has("pageNum")
                    ? jsonObject.get("pageNum").getAsInt() : 1;
            int pageSize = jsonObject.has("pageSize")
                    ? jsonObject.get("pageSize").getAsInt() : 10;
            // 查找
            Page<Price> page = adminService.selectByDest(dest, pageNum, pageSize);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", page);
            return priceJsons;
        } catch (ValidationException r) {
            return new PriceJsons(1001, r.getMessage());
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 用于输入公司，返回同一公司不同收件地的报价表
     *
     * @param request http请求
     * @return List<Price> 返回同一公司不同收件地的报价表
     */
    @ApiOperation(value = "依据快递公司查询报价表", notes = "公司名字:companyname 页数：pageNum 显示数目：pageSize")
    @RequestMapping(value = "priceListCompany", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons listcompany(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 获取相应字段
            String companyname = jsonObject.get("companyname").getAsString().trim();
            // 设置可能不传递参数解决形式
            int pageNum = jsonObject.has("pageNum")
                    ? jsonObject.get("pageNum").getAsInt() : 1;
            int pageSize = jsonObject.has("pageSize")
                    ? jsonObject.get("pageSize").getAsInt() : 10;
            // 查找
            Page<Price> page = adminService.selectByCompany(companyname,pageNum,pageSize);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", page);
            return priceJsons;
        } catch (ValidationException r) {
            return new PriceJsons(1001, r.getMessage());
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }


    /**
     * 按快递快递公司与收件地并搜索
     *
     * @param request http请求
     * @return PriceJsons 报价表JSON值
     */
    @ApiOperation(value = "收件地与快递快递公司并查询", notes = "公司名字：companyname 收件地：dest " +
            "页数：pageNum 数目：pageSize " )
    @RequestMapping(value = "/priceCompanyAndDest", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons getpriceand(HttpServletRequest request) {
        try {
            // 获取带有json的请求
            JsonObject jsonObject = getJsonObject(request);
            // 设置可能不传递参数解决形式
            int pageNum = jsonObject.has("pageNum")
                    ? jsonObject.get("pageNum").getAsInt() : 1;
            int pageSize = jsonObject.has("pageSize")
                    ? jsonObject.get("pageSize").getAsInt() : 10;
            // 获取相应字段
            String dest = jsonObject.get("dest").getAsString().trim();
            // 获取相应字段
            String companyname = jsonObject.get("companyname").getAsString().trim();
            // 查找
            Page<Price> prices = adminService.selectByCompanyAndDest(companyname, dest, pageNum, pageSize);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", prices);
            return priceJsons;
        } catch (ValidationException r) {
            return new PriceJsons(1001, r.getMessage());
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }


    /**
     * @param file
     * @return
     * @throws IOException
     * @创建时间 2018年1月20日13:36:51
     * @描述 将获取的excel表导入数据库
     * @author hjj
     */
    @PostMapping(value = "${importExcel}")
    public PriceJsons importExcel(@RequestParam(value = "filename") MultipartFile file) throws IOException {
        try {
            priceJsons.setStatus(1000);
            priceJsons.setMessage(adminService.executeImportExcel(file));
            priceJsons.setResult(null);
            return priceJsons;
        } catch (ImportException ie) {
            logger.info("出现错误："+ie.getMessage());
            priceJsons.setStatus(1001);
            priceJsons.setMessage(ie.getMessage());
            priceJsons.setResult(null);
            return priceJsons;
        }
    }
}
